package com.cskaoyan.javase.basic._5conversion;

/**
 * @description: 基本数据类型的类型转换
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 基本数据类型的类型转换在数值类型和字符型之间产生,布尔类型不参与任何类型转换
 * 数据类型的转换的分类:
 *      1,自动类型转换,自动类型转换指的是由编译器自动的转换数据类型,程序员无需写代码进行类型转换
 *          由编译器自动完成
 *      2,强制类型转换,编译器不进行类型转换,而是由程序员手动写代码完成类型转换
 *          由程序员写代码完成
 * 基本数据类型的类型转换:
 *      1,自动类型转换,指由小取值范围的变量转换到大取值范围的变量的过程可以自动完成
 *          注意long类型转换到float类型是自动的,因为float虽然四个字节但是它的取值范围大
 *          小到大一定能够装得下,数据一定不会出现装不下的情况,所以编译器能够自动完成
 *          基本数据类型的自动类型转换也称之为类型提升
 *
 *      2,强制类型转换,指的是大取值范围到小取值范围的变量,该过程是存在风险的,可能会出现数据装不下(数据溢出,数据失真)的情况,于是编译器不会帮你自动完成,而需要程序员手动进行操作,完成类型转换
 *      强转的语法:
 *       强转后的数据类型 变量名 = (强转后的数据类型)变量名/常量
 *       强制类型转换是具有风险的,编译器不保证强转后的数据不失真,所以做强转时一定要斟酌能否完成强转
 *
 *
 * 自动类型转换是编译器自动完成的,那么数据类型转换后的数据一定安全,一定不会失真吗?
 * 会,有可能
 * 比如int类型 --> float 7~8位有效 可能精度丢失
 * int --> double 不会精度丢失
 * long --> float 可能精度丢失
 * long ---> double 可能会精度丢失
 *
 *
 * byte、short、char之间不互相转换，一旦发生运算，一律自动转换为int进行运算，结果是int
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        /*long a = 20; //正确的
        //float b = 10.0;  大变小 不是自动类型转换

        float b = (float) 10.0;
        byte c = (byte) 128;
        System.out.println(c);*/

        //int a = 1399999999;
        //float b = a;
        //System.out.println(b);

        int a = 10;
        long b = 20;
        int c = ((int) (a + b));
        //System.out.println(a + b);

        byte a1 = 10;
        byte a2 = 20;
        char a3 = 'a'; //97
        //byte c2 = a1 + a2;
        System.out.println(a3 + a1);

    }
}
